package com.cuanbobox.utils;

import android.os.SystemClock;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 收发ADB指令工具类
 */
public class ADBUtil {

    /**
     * 执行 adb 命令
     *
     * @param cmd 要执行的命令
     * @return 执行结果
     */
    public static StringBuffer ADBExec(String cmd) {
        return ADBExec(cmd, true);
    }

    /**
     * 执行 adb 命令
     *
     * @param cmd       要执行的命令
     * @param saveToLog 是否将执行记录保持到日志中
     * @return 执行结果
     */
    public static StringBuffer ADBExec(String cmd, boolean saveToLog) {
        try {
            if (saveToLog) {
                LogUtil.add("执行", "" + cmd, "ADB命令");
            }
            Runtime mRuntime = Runtime.getRuntime(); //执行命令的方法
            //Process中封装了返回的结果和执行错误的结果
            Process mProcess = mRuntime.exec(cmd); //加入参数
            //使用BufferReader缓冲各个字符&#xff0c;实现高效读取
            //InputStreamReader将执行命令后得到的字节流数据转化为字符流
            //mProcess.getInputStream()获取命令执行后的的字节流结果
            BufferedReader mReader = new BufferedReader(new InputStreamReader(mProcess.getInputStream()));
            //实例化一个字符缓冲区
            StringBuffer mRespBuff = new StringBuffer();
            //实例化并初始化一个大小为1024的字符缓冲区&#xff0c;char类型
            char[] buff = new char[1024];
            int ch = 0;
            //read()方法读取内容到buff缓冲区中&#xff0c;大小为buff的大小&#xff0c;返回一个整型值&#xff0c;即内容的长度
            //如果长度不为null
            while ((ch = mReader.read(buff)) != -1) {
                //就将缓冲区buff的内容填进字符缓冲区
                mRespBuff.append(buff, 0, ch);
            }
            //结束缓冲
            mReader.close();
            if (saveToLog) {
                LogUtil.add("返回数据", mRespBuff.toString(), "ADB命令");
            }
            return mRespBuff;

        } catch (IOException e) {
            LogUtil.addError("执行ADB命令时发生了异常");
            LogUtil.addError("要执行的命令:" + cmd);
            LogUtil.addError(e);
        }
        return null;
    }

    /**
     * 重启系统
     */
    public static void reboot() {
/*        if (App.configInfo.isClassRoomState()) {
            LogUtil.add("reboot", "当前为上课状态，屏蔽本次重启操作", "系统重启");
            return;
        }*/
        LogUtil.add("reboot", "执行重启操作", "系统重启");
        ADBUtil.ADBExec("reboot");
    }

    /**
     * 获取系统时间
     */
    public static void getSysOnTime() {
        String result = ADBExec("cat /sys/class/rtc/rtc0/wakealarm", true).toString();
    }

    // 设置新的系统时间，单位毫秒
    public static void setSystemTime(long newTime) {
        try {
            // 使用Runtime执行命令需要root权限
            Runtime.getRuntime().exec(new String[]{"date", String.valueOf(newTime)});
            // 或者使用SystemClock修改时间
            SystemClock.setCurrentTimeMillis(newTime);
        } catch (Exception e) {
            LogUtil.addError("修改系统时间失败!");
        }
    }

    public static String readCardInfo() {
        return ADBExec("cat /dev/ttyS5", true).toString();
    }
}
